package main

import "fmt"

// 运算符

func main() {
	var (
		a = 5
		b = 2
	)

	// 算术运算符
	fmt.Println(a + b)
	fmt.Println(a - b)
	fmt.Println(a * b)
	fmt.Println(a / b)
	fmt.Println(a % b)
	a++ // 单独的语句，不能放在=的右边赋值
	b--
	fmt.Println(a)
	fmt.Println(b)

	// 关系运算符
	fmt.Println(a == b) // Go 语言时强类型，相同类型的变量才能比较
	fmt.Println(a != b)
	fmt.Println(a >= b)
	fmt.Println(a <= b)
	fmt.Println(a > b)
	fmt.Println(a < b)

	// 逻辑运算符
	// 如果年龄大于18岁并且年龄小于60岁
	age := 22
	if age > 18 && age < 60 {
		fmt.Println("苦逼")
	} else {
		fmt.Println("不用上班")
	}

	// 如果年龄小于18岁，或者年龄大于60岁
	if age < 18 || age > 60 {
		fmt.Println("不用上班")
	} else {
		fmt.Println("苦逼")
	}

	// not 取反
	isMarried := false
	fmt.Println(isMarried)  // false
	fmt.Println(!isMarried) // true

	// 位运算: 针对的是二进制数
	// &: 按位与
	fmt.Println(5 & 2) // 000

	// |: 按位或
	fmt.Println(5 | 2) // 111

	// ^ 按位异或（两位不一样则为1）
	fmt.Println(5 ^ 2) // 111

	// <<: 将二进制位左移指定位数
	fmt.Println(5 << 1)  // 1010 => 10
	fmt.Println(1 << 10) // 10000000000 => 1024

	// >> : 将二进制位向右移指定位数
	fmt.Println(5 >> 1) // 10 => 2

	var m = int8(1) // 只能存8位
	fmt.Println(m << 10)

	// 赋值运算符 ， 用来给变量赋值的
	var x int
	x = 10
	x += 1 // x = x + 1
	x -= 1
	x *= 2
	x /= 2
	x %= 2
	x <<= 2
	x >>= 1
	x &= 2
	x |= 3
	x ^= 2

	fmt.Println(x)

}
